wayland: Apply new surface state at the beginning of a frame
authorJonas Ådahl <jadahl@gmail.com>
Mon, 23 Nov 2020 16:26:06 +0000 (17:26 +0100)
committerJonas Ådahl <jadahl@gmail.com>
Mon, 7 Dec 2020 08:46:39 +0000 (09:46 +0100)
Concentrate state application to the start of a frame; this is to avoid
having GTK going back and forth between different state if so would
happen between two frames.

gdk/wayland/gdksurface-wayland.c

index 39e815a219e6cc70c01aa76131d2bfe5f1b0569c..bcbc647a285caa1e608fffc0ccbab8c8426b429f 100644 (file)
@@ -587,6 +587,8 @@ on_frame_clock_before_paint (GdkFrameClock *clock,
        */
       timings->predicted_presentation_time = timings->frame_time + refresh_interval / 2 + refresh_interval;
     }
+
+  gdk_surface_apply_state_change (surface);
 }
 
 void
@@ -1401,7 +1403,7 @@ gdk_wayland_surface_configure_toplevel (GdkSurface *surface)
                        (new_state & GDK_TOPLEVEL_STATE_FOCUSED) ? " focused" : "",
                        (new_state & GDK_TOPLEVEL_STATE_TILED) ? " tiled" : ""));
 
-  gdk_surface_set_state (surface, new_state);
+  gdk_surface_queue_state_change (surface, ~0 & ~new_state, new_state);
 
   switch (display_wayland->shell_variant)
     {
@@ -1482,10 +1484,7 @@ maybe_notify_mapped (GdkSurface *surface)
     return;
 
   if (!GDK_SURFACE_IS_MAPPED (surface))
-    {
-      gdk_synthesize_surface_state (surface, GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
-      gdk_surface_invalidate_rect (surface, NULL);
-    }
+    gdk_surface_queue_state_change (surface, GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
 }
 
 static void